#!/usr/bin/env python
# coding: utf-8

# In[44]:


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


# In[2]:


data=pd.read_csv("./Tweets.csv")


# In[3]:


data.head() 


# In[4]:


data=data[['airline_sentiment','text']]


# In[5]:


data.info()


# In[6]:


data.head()


# In[7]:


data.airline_sentiment.unique()


# In[8]:


data.airline_sentiment.value_counts()


# In[9]:


import re


# In[10]:


token=re.compile(r'[A-Za-z]+|[!?.:,()]')


# In[11]:


def extract_text(text):
    new_text=token.findall(text)
    new_text=' '.join([x.lower() for x in new_text])
    return new_text


# In[12]:


x=data.text.apply(extract_text) #特征


# In[13]:


y=data.airline_sentiment       #目标


# In[14]:


from sklearn.model_selection import train_test_split


# In[15]:


x_train,x_test,y_train,y_test=train_test_split(x,y)


# In[16]:


x_train.shape


# In[17]:


x_train


# In[18]:


from sklearn.feature_extraction.text import TfidfVectorizer       #引入包进行处理文本


# In[19]:


vect=TfidfVectorizer(ngram_range=(1,3),stop_words='english',min_df=3)     


# 第一个ngram_range为以一个到三个进行划分，第二个stop_words停用词为english，第三个min_df是代表删除小于3的频率的单词

# In[20]:


x_train_vect=vect.fit_transform(x_train)   #开始对文本数据训练集进行训练转为向量化预处理 用的fit_transform（）


# In[21]:


x_train_vect


# In[22]:


x_test_vect=vect.transform(x_test)        #开始对文本数据测试集进行训练转为向量化预处理 用的transform（）


# In[23]:


x_test_vect


# In[24]:


from sklearn.ensemble import RandomForestClassifier


# In[25]:


model=RandomForestClassifier()


# In[26]:


model.fit(x_train_vect,y_train)


# In[27]:


model.score(x_test_vect,y_test)


# In[28]:


model.score(x_train_vect,y_train)


# In[29]:


model2=RandomForestClassifier(n_estimators=500)


# In[30]:


model2.fit(x_train_vect,y_train)


# In[31]:


model.score(x_train_vect,y_train)


# In[32]:


model.score(x_test_vect,y_test)


# 还是过拟合，所以我们要对参数进行调优进行阻止过拟合

# 所以我们使用交叉验证

# In[33]:


from sklearn.model_selection import GridSearchCV              #引入CV包


# In[34]:


param={'max_depth':range(1,500,10),'criterion':['gini','entropy']}       #调参数


# In[35]:


grid_s=GridSearchCV(RandomForestClassifier(),param,cv=5)               #初始化模型


# In[36]:


x_vect=vect.transform(x) #因为x是文本数据，所以我们用TfidfVectorizer包中vect.transform()把原来的文本数据进行向量化预处理


# In[37]:


grid_s.fit(x_vect,y)


# In[38]:


grid_s.best_params_  #得出最好的参数，得分最高的参数与阈值


# In[39]:


grid_s.best_score_


# #用朴素贝叶斯算法

# In[40]:


from sklearn.naive_bayes import MultinomialNB
model=MultinomialNB(alpha=0.0001)
model.fit(x_train_vect,y_train)
model.score(x_train_vect,y_train)


# In[41]:


model.score(x_test_vect,y_test)


# In[50]:


test_score=[]
alpha2=np.linspace(0.00001,0.01,100)
for a in alpha2:
    model=MultinomialNB(alpha=a)
    model.fit(x_train_vect,y_train)
    test_score.append(model.score(x_test_vect,y_test))


# In[51]:


test_score


# In[53]:


a=max(test_score)


# In[55]:


b=test_score.index(a)


# In[59]:


bast_alpha=alpha2[b]


# In[60]:


bast_alpha


# 模型评价

# In[61]:


model=MultinomialNB(alpha=bast_alpha)
model.fit(x_train_vect,y_train)


# In[62]:


from sklearn.metrics import classification_report  #引入模型评价包


# In[63]:


pred=model.predict(x_test_vect)


# In[66]:


import pprint
pprint.pprint(classification_report(y_test,pred))


# In[67]:


from sklearn.metrics import confusion_matrix
cm=confusion_matrix(y_test,pred)         #得出混淆矩阵


# In[68]:


plt.matshow(cm)  #可视化
plt.colorbar()


# In[ ]:




